package top.maof.mfcoin.net.message;

import com.alibaba.fastjson.JSON;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageCodec;

import java.util.List;

@ChannelHandler.Sharable
public class MessageCodec extends MessageToMessageCodec<ByteBuf, Message> {
    @Override
    protected void encode(ChannelHandlerContext ctx, Message msg, List<Object> out)
            throws Exception {
        ByteBuf byteBuf = ctx.alloc().buffer();
        // 协议名
        byteBuf.writeBytes(Protocol.NAME);
        // 协议版本
        byteBuf.writeByte(Protocol.VERSION);
        byte[] bytes = JSON.toJSONString(msg).getBytes(Protocol.CHARSET);
        // 消息内容长度
        byteBuf.writeInt(bytes.length);
        // 消息实际内容
        byteBuf.writeBytes(bytes);
        out.add(byteBuf);
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> out)
            throws Exception {
        // 协议名
        byte[] bytesName = new byte[Protocol.NAME.length];
        byteBuf.readBytes(bytesName, 0, bytesName.length);
        String name = new String(bytesName);
        // 协议版本
        byte version = byteBuf.readByte();
        // 消息内容长度
        int length = byteBuf.readInt();
        // 消息实际内容
        byte[] bytesContent = new byte[length];
        byteBuf.readBytes(bytesContent, 0, length);
        String content = new String(bytesName, Protocol.CHARSET);
        Message message = JSON.parseObject(content, Message.class);

        out.add(message);
    }
}
